package com.myk.game.gobangchess.expand.bwantispace;


import com.myk.game.gobangchess.rooms.prerooms.BWAntiSpaceRoom;

import java.util.ArrayList;
import java.util.List;

/**
 * 游戏状态实体
 */
public class Game {
    public transient GameHelper helper; //工具方法封装类（不参与序列化，反射生成后在注射进去）
    public List<BaseMonsterPiece> fieldMonsterList; //场上怪物集合
    public List<BasePropPiece> fieldPropList; //场上道具集合
    public Human human; //场上的主角
    public long killCount; //击杀怪物数量
    public long liveDay; //存活天数

    public Game(BWAntiSpaceRoom room) {
        helper = new GameHelper(room, this);
    }

    //游戏开始时随机初始化地图上的棋子
    private void makeStartPiecesRandom() {
        //++用特定的算法生成墙壁，或者从初始地形表里随机生成
        //随机生成10个怪物
        for (int i = 0; i < 10; i++) {
            this.makeMonsterRandom();
        }
    }

    //随机生成一个怪物棋子
    private void makeMonsterRandom() {
        //获取一个棋盘边缘的随机空格
        int[] rdmPos = helper.getRandomBoardSideEmptyPosition();
        if (rdmPos != null) {
            //5分之一的几率召唤暴徒
            if (Math.random() < 0.2) {
                fieldMonsterList.add(new MonsterBT(this, rdmPos[0], rdmPos[1]));
                helper.room.curGrids[rdmPos[0]][rdmPos[1]] = 7;
            }
            //默认召唤丘林
            else {
                fieldMonsterList.add(new MonsterQL(this, rdmPos[0], rdmPos[1]));
                helper.room.curGrids[rdmPos[0]][rdmPos[1]] = 7;
            }
        }
    }

    //指定位置创建玩家棋子
    private void makeHumanConfirm(int row, int col) {
        //指定位置为空地时
        if (helper.isEmptyPos(row, col)) {
            //生成玩家棋子
            human = new Human(this, row, col);
            //通知ai机器人操作
            helper.noticeRobotAction();
        }
    }

    /**
     * 游戏开始初始化
     */
    public void start() {
        this.fieldMonsterList = new ArrayList<>();
        this.fieldPropList = new ArrayList<>();
        this.makeStartPiecesRandom();
        helper.noticeHumanAction("请选择你的出生点");
    }

    /**
     * 玩家点击棋盘解析
     */
    public void doRule(int row, int col) {
        //玩家不存在的时候指定位置创建玩家
        if (human == null) {
            makeHumanConfirm(row, col);
        }
        //玩家棋子存在时
        else {
            //玩家棋子移动或者攻击完成后
            if (human.moveOrAttack(row, col)) {
                //通知ai机器人操作
                helper.noticeRobotAction();
            }
            //点击的位置不能移动的话
            else {
                //弹窗点击到的棋子的详细信息
                BasePiece piece = helper.getPieceByPos(row, col);
                if (piece instanceof IGameInformation) {
                    helper.showPieceInfo((IGameInformation) piece);
                }
            }
        }
    }

    /**
     * 游戏流程驱动
     */
    public void update() {
        //获取场上所有怪物，再根据它们离主角的距离进行排序
        List<BaseMonsterPiece> monsterList = helper.getAllMonsterPiecesAndSort();
        //怪物数量少于50的时候随机生成1-2只怪物
        if (fieldMonsterList.size() < 50) {
            for (int i = 0; i < (int) (Math.random() * 2) + 1; i++) {
                makeMonsterRandom();
            }
        }
        //新召唤的怪物除外，其他所有怪物行动
        for (BaseMonsterPiece monster : monsterList) {
            //helper.room.sleep(100);
            monster.updateSelf();
            //helper.room.noticeAllRefreshGameInfo();
        }

        //切换玩家移动 //++如果玩家没有死的话，如果玩家死了，那就谁都不能移动，分发按钮给玩家
        if (human.hp <= 0) {
            human = null;
            helper.room.manager.setGameTip("你已死亡");
            helper.room.manager.noticeHumanMove();
        }
        else {
            helper.noticeHumanAction("等待玩家行动");
        }
    }

    /**
     * 游戏画面渲染
     */
    public void render() {
        //++根据状态渲染棋盘背景
        //渲染棋盘上所有的棋子
        helper.getAllFieldPieces().forEach(BasePiece::renderSelf);
        //++渲染存活天书和击杀怪物数量
    }

}